#ifndef KAFKA_PRODUCER_H
#define KAFKA_PRODUCER_H

#include <string>
#include <memory>
#include <vector>
#include <functional>
#include <future>
#include <map>

// 前向声明，避免直接引入librdkafka的头文件
namespace RdKafka {
    class Producer;
    class Topic;
    class Message;
    class Conf;
}

namespace messaging {

// 消息发送回调函数类型
using DeliveryCallback = std::function<void(bool success, const std::string& error)>;

// Kafka生产者配置
struct KafkaProducerConfig {
    std::string brokers;                  // Kafka broker地址列表，如 "localhost:9092"
    std::string clientId;                 // 客户端ID
    int timeoutMs;                        // 超时时间（毫秒）
    int queueBufferingMaxMs;              // 消息缓冲最大时间（毫秒）
    int queueBufferingMaxMessages;        // 缓冲区最大消息数
    int queueBufferingMaxKbytes;          // 缓冲区最大大小（KB）
    int requestRequiredAcks;              // 确认级别 (0, 1, -1)
    
    KafkaProducerConfig() 
        : brokers("kafka:9092"), clientId("kafka-producer"),
          timeoutMs(5000), queueBufferingMaxMs(1000), 
          queueBufferingMaxMessages(10000), queueBufferingMaxKbytes(1024),
          requestRequiredAcks(1) {}
};

// Kafka生产者类
class KafkaProducer {
public:
    // 创建Kafka生产者
    static std::shared_ptr<KafkaProducer> create(const KafkaProducerConfig& config);
    
    ~KafkaProducer();
    
    // 发送消息到指定主题
    bool send(const std::string& topic, const std::string& key, const std::string& value, 
              DeliveryCallback callback = nullptr);
    
    // 发送消息并等待结果
    std::future<bool> sendAsync(const std::string& topic, const std::string& key, const std::string& value);
    
    // 刷新所有未发送的消息
    void flush(int timeoutMs = 5000);
    
    // 轮询事件
    void poll(int timeoutMs = 0);

private:
    KafkaProducer(const KafkaProducerConfig& config);
    
    // 初始化生产者
    bool init(const KafkaProducerConfig& config);
    
    // 获取或创建主题
    RdKafka::Topic* getTopic(const std::string& topic);

private:
    std::unique_ptr<RdKafka::Producer> producer_;
    std::unique_ptr<RdKafka::Conf> conf_;
    std::map<std::string, std::unique_ptr<RdKafka::Topic>> topics_;
    bool isRunning_;
};

} // namespace messaging

#endif // KAFKA_PRODUCER_H 